MNIST Classfier with Estimator

추정기를 사용하면, 다층 퍼셉트론을 매우 간단하게 구현할 수 있다.
import tensorflow_datasets as tfds
import tensorflow as tf
import numpy as np
BUFFER_SIZE=10000
BATCH_SIZE=64
NUM_EPOCHS=20
steps_per_epoch=np.ceil(60000/BATCH_SIZE)
입력 이미지와 레이블을 전처리하는 헬퍼 함수 정의
tf.image.convert_image_dtype()

[0, 255] 범위의 이미지를 tf.float32타입으로 변환: 결국 [0, 1] 범위가 된다.
def preprocess(item):
image=item['image']
label=item['label']
image=tf.image.convert_image_dtype(image, tf.float32)
image=tf.reshape(image, (-1, ))
return {'image-pixels':image}, label[..., tf.newaxis]
1. 입력 함수 정의
def train_input_fn():
datasets=tfds.load(name='mnist')
mnist_train=datasets['train']
dataset=mnist_train.map(preprocess)
dataset=dataset.shuffle(BUFFER_SIZE)
dataset=dataset.batch(BATCH_SIZE)
return dataset.repeat()
def eval_input_fn():
datasets=tfds.load(name='mnist')
mnist_test=datasets['test']
dataset=mnist_test.map(preprocess).batch(BATCH_SIZE)
return dataset
특성은 ‘image-pixels’ 키 하나임
2. 특성 열을 정의
image_feature_column=tf.feature_column.numeric_column(key='image-pixels', shape=(28*28))
3. 추정기 생성
두개의 은닉층(1층 32, 2층 16개의 유닛)
n_class를 이용해서 클래스의 개수를 지정
dnn_classifier=tf.estimator.DNNClassifier(
feature_columns=[image_feature_column],
hidden_units=[32, 16],
n_classes=10,
model_dir='/Users/csian/Desktop/CP/data_set/model/mnist-dnn/')
4. train, evaluate, predict
dnn_classifier.train(
input_fn=train_input_fn,
steps=NUM_EPOCHS*steps_per_epoch)
eval_result=dnn_classifier.evaluate(
input_fn=eval_input_fn)
print(eval_result)

{'accuracy': 0.0995, 'average_loss': 3.2100132, 'loss': 3.2074592, 'global_step': 18760}

전체적으로 추정기를 이용해서 계산한 데이터의 계산값이 이상하다…
추후에 꼭 확인해 볼것...